package cn.baiy;
  //海洋超类    /派生类有：战舰类/炸弹类/水雷类/水雷潜艇类/侦察潜艇类/鱼雷潜艇类。

import javax.swing.ImageIcon;
import java.io.Serializable;
import java.util.Random;  //导入随机生成整数的类
import java.awt.Graphics;

//因为战舰/三种潜艇/水雷/炸弹都有宽、高、x坐标、y坐标、速度，所以给它们创建一个超类来赋初始值。
public abstract class SeaObject implements Serializable {
    public static final long serialVersionUID = 1L;
    public static final int LIVE = 0;//活着的
    public static final int DEAD = 1;//死了的
    protected int state = LIVE;//当前状态（默认活着的）


    protected int width;//要改正
    protected int height;//要改正
    protected int x;//要改正
    protected int y;//要改正
    protected int speed;//要改正

    //因为三种潜艇的起始位置都在差不多的位置、速度都是随机的，所以给它们构造一个方法来赋初始值。
    public SeaObject(int width,int height){
        this.width = width;
        this.height = height;
        x = -width;/////////////////////////////////////////////////////////////////////////22.4.18只是试一下，要改成-width
        Random rand = new Random();  //调用随机生成整数的类（括号内填3：表示随机生成0，1，2之间的整数）
        y = rand.nextInt(World.HEIGHT-height-150+1)+150;  //生成150<=y<=460之间的整数
        speed = rand.nextInt(3)+1;  //随机生成1<=speed<=3之间的整数
    }

    //因为战舰/水雷/炸弹的属性都不一样，所以给它们构造一个方法来赋初始值。
    public SeaObject(int width,int height,int x,int y,int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }

    public abstract void move();///*{System.out.println("海洋对象移动");}*/

    public abstract ImageIcon getImage();//抽象方法没有{}

    public boolean isLive(){//判断对象是否还活着的
        return state == LIVE;
    }

    public boolean isDead(){//判断对象是否是死了的
        return state == DEAD;
    }

    public void paintImage(Graphics g){//画对象  （g：画笔）
        if (isLive()){
            this.getImage().paintIcon(null,g,this.x,this.y);
        }
    }

    public boolean isOutOfBounds(){//检测潜艇越界
        return x >= World.WIDTH;
    }

    public boolean isHit(SeaObject other){//检测碰撞（this：一个对象、other:另一个对象。）
        //假设：this表示潜艇、other表示炸弹。
        int x1 = this.x - other.width;//x1=潜艇的x-炸弹和宽
        int x2 = this.x + this.width;//x2=潜艇的x+潜艇的宽
        int y1 = this.y - other.height;//y1=潜艇的y-炸弹和高
        int y2 = this.y + this.height;//y2=潜艇的y+潜艇和高
        int x = other.x;//x=炸弹的x
        int y = other.y;//y=炸弹的y
        return x >= x1 && x <= x2 && y >= y1 && y <= y2;//在这个框内表示撞上了
    }

    public void goDead(){//海洋对象去死
        state = DEAD;
    }

}